home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 1.iso / dist / fw_enscript.idb / usr / freeware / share / enscript / hl / objc.st.z / objc.st
Encoding:
Text File  |  2002-04-08  |  5.0 KB  |  232 lines

  1. /**
  2.  * Name: objc
  3.  * Description: Objective-C programming language.
  4.  * Author: Markku Rossi <mtr@iki.fi> with help of Emacs' `font-lock.el'.
  5.  */
  6.  
  7. objc_type_re =
  8. /* Types.
  9.    (build-re '(auto extern register static typedef struct union enum
  10.    signed unsigned short long int char float double void volatile
  11.    const id oneway in out inout bycopy byref))
  12.  */
  13.   /\b(auto|by(copy|ref)|c(har|onst)|double|e(num|xtern)|float\
  14. |i(d|n(|out|t))|long|o(neway|ut)|register|s(hort|igned|t(atic|ruct))\
  15. |typedef|un(ion|signed)|vo(id|latile))\b/;
  16.  
  17.  
  18. state objc_method_line extends CHighlight
  19. {
  20.   /* Argument declarations after the method.
  21.    $1      $2                       $3       $4 $5           $6      $7 */
  22.   /([ \t]*)([A-Za-z_][A-Za-z_0-9]*)?(:[ \t]*)(\(([^)\n]+)\))?([ \t]*)([A-Za-z_][A-Za-z_0-9]*)/ {
  23.     language_print ($1);
  24.  
  25.     if (length ($2) > 0)
  26.       {
  27.     function_name_face (true);
  28.     language_print ($2);
  29.     function_name_face (false);
  30.       }
  31.  
  32.     language_print ($3);
  33.  
  34.     if (length ($4) > 0)
  35.       {
  36.     language_print ("(");
  37.     type_face (true);
  38.     language_print ($5);
  39.     type_face (false);
  40.     language_print (")");
  41.       }
  42.  
  43.     language_print ($6);
  44.  
  45.     variable_name_face (true);
  46.     language_print ($7);
  47.     variable_name_face (false);
  48.   }
  49.  
  50.   /\n/ {
  51.     language_print ($0);
  52.     return;
  53.   }
  54. }
  55.  
  56. /* This is *not* inherited from CHighlight. */
  57. state objc_method_continuation_line
  58. {
  59.   /* Method names and arguments on lines following the function declaration.
  60.     $1      $2                       $3       $4 $5           $6      $7 */
  61.   /^([ \t]*)([A-Za-z_][A-Za-z_0-9]*)?(:[ \t]*)(\(([^)\n]+)\))?([ \t]*)\
  62. ([A-Za-z_][A-Za-z_0-9]*)/ {
  63.     language_print ($1);
  64.  
  65.     if (length ($2) > 0)
  66.       {
  67.         function_name_face (true);
  68.         language_print ($2);
  69.         function_name_face (false);
  70.       }
  71.  
  72.     language_print ($3);
  73.  
  74.     if (length ($4) > 0)
  75.       {
  76.         language_print ("(");
  77.         type_face (true);
  78.         language_print ($5);
  79.         type_face (false);
  80.         language_print (")");
  81.       }
  82.  
  83.     language_print ($6);
  84.  
  85.     variable_name_face (true);
  86.     language_print ($7);
  87.     variable_name_face (false);
  88.  
  89.     /* Highlight all remaining arguments on this line. */
  90.     call (objc_method_line);
  91.   }
  92.  
  93.   /*
  94.    * If the previous one didn't match, we'r done with this method
  95.    * declaration.
  96.    */
  97.   /()/ {
  98.     return;
  99.   }
  100. }
  101.  
  102. /* This is *not* inherited from CHighlight. */
  103. state objc_compiler_directive_line
  104. {
  105.   /([ \t:<(,]*)([A-Za-z_][A-Za-z_0-9]*)/ {
  106.     language_print ($1);
  107.  
  108.     function_name_face (true);
  109.     language_print ($2);
  110.     function_name_face (false);
  111.   }
  112.  
  113.   /*
  114.    * If the previous one didn't match, we'r done with this directive.
  115.    * Yes, that should match an empty string.
  116.    */
  117.   /()/ {
  118.     return;
  119.   }
  120. }
  121.  
  122. /*
  123.  * We inherit the Objective-C state from the C state.  This gives us
  124.  * all the defaults, etc.  All we have to do here is to overwrite
  125.  * things that are not implemented, or are broken.
  126.  */
  127. state objc extends c
  128. {
  129.   BEGIN {
  130.     /* See `c.st' for the comments on this one. */
  131.     type_re = objc_type_re;
  132.   }
  133.  
  134.   /* One line comments. */
  135.   /\/\// {
  136.     comment_face (true);
  137.     language_print ($0);
  138.     call (eat_one_line);
  139.     comment_face (false);
  140.   }
  141.  
  142.   /* Compiler directives. */
  143.   /(@)([A-Za-z][A-Za-z0-9]*)\>/ {
  144.     /* Leading garbage. */
  145.     language_print ($1);
  146.  
  147.     /* The directive. */
  148.     keyword_face (true);
  149.     language_print ($2);
  150.     keyword_face (false);
  151.  
  152.     /* And all the remaining stuff on this line. */
  153.     call (objc_compiler_directive_line);
  154.   }
  155.  
  156.   /* Keywords.  Basicly what's missing from C *but* not goto or case.
  157.      (build-re '(self super _cmd id Class SEL IMP BOOL YES NO nil Nil))
  158.    */
  159.   /\b(BOOL|Class|IMP|N(O|il)|SEL|YES|_cmd|id|nil|s(elf|uper))\b/ {
  160.     keyword_face (true);
  161.     language_print ($0);
  162.     keyword_face (false);
  163.   }
  164.  
  165.   /* Types. */
  166.  objc_type_re {
  167.     type_face (true);
  168.     language_print ($0);
  169.     type_face (false);
  170.   }
  171.  
  172.   /* Method names.  First, on the same line as the function declaration.
  173.    $1           $2        $3      $4 $5           $6      $7 */
  174.   /(^[+-][ \t]*)(PRIVATE)?([ \t]*)(\(([^)\n]+)\))?([ \t]*)([A-Za-z_]\
  175. [A-Za-z_0-9]*)/ {
  176.     language_print ($1);
  177.  
  178.     if (length ($2) > 0)
  179.       {
  180.     type_face (true);
  181.     language_print ($2);
  182.     type_face (false);
  183.       }
  184.  
  185.     language_print ($3);
  186.  
  187.     if (length ($4) > 0)
  188.       {
  189.     language_print ("(");
  190.     type_face (true);
  191.     language_print ($5);
  192.     type_face (false);
  193.     language_print (")");
  194.       }
  195.  
  196.     language_print ($6);
  197.  
  198.     function_name_face (true);
  199.     language_print ($7);
  200.     function_name_face (false);
  201.  
  202.     /* Highlight arguments from the same line. */
  203.     call (objc_method_line);
  204.  
  205.     /*
  206.      * Method names and arguments on lines following the function declaration.
  207.      */
  208.     call (objc_method_continuation_line);
  209.   }
  210.  
  211.   /*
  212.    * Labels and case tags.  These must remain as a sole statement on a line,
  213.    * otherwise we detect selectors.  Emacs accepts also bare numbers.
  214.    */
  215.   /^([ \t]*)([a-zA-Z0-9_]+)(:[ \t]*)$/ {
  216.     language_print ($1);
  217.  
  218.     reference_face (true);
  219.     language_print ($2);
  220.     reference_face (false);
  221.  
  222.     language_print ($3);
  223.   }
  224. }
  225.  
  226.  
  227. /*
  228. Local variables:
  229. mode: c
  230. End:
  231. */
  232.